#include <stdio.h>

#if 0
    int main()
    {
        printf("hello world\n");
        return 0;
    }
#endif

#if 0
    int a = 10;
    int main()
    {
        int a = 20; // 小作用域内，如果全局变量和局部变量名字相同会被屏蔽，在C语言中没有直接的方式取到这个全局变量a
        printf("%d\n", a);
        return 0;
    }
#endif

#if 0
    // 命名空间
    namespace A
    {
        int a = 10; // 之前的全局变量被包在了命名空间A当中，它成为了命名空间A下的一个普通变量
    }
    
    int main()
    {
        int a = 20; 
        printf("%d\n", a);
        printf("%d\n", A::a);   //域解析符（表示a来自A的命名空间 解析它的名字）
        return 0;
    }
#endif

#if 0
    // 命名空间不光可以定义变量，还可以定义全局的函数
    namespace A
    {
        int a = 10;
        void func()
        {
            printf("namespace A\n");
        }

        // 命名空间可以嵌套
        namespace B
        {
            void func()
            {
                printf("namespace A::B\n"); //命名空间可以嵌套
            }
        }
    }

    namespace B
    {
        void func()
        {
            printf("namespace B\n");
        }
    }
    
    int main()
    {
        // 这也解决了函数重名的问题
        A::func();
        B::func();
        A::B::func();
        return 0;
    }
#endif

#if 1
    // 当命名空间名字很长写起来不太方便时
    // 为了简化，引入新的关键字using
    namespace A
    {
        int a = 10;
        void func()
        {
            printf("namespace A\n");
        }

        namespace B
        {
            void func()
            {
                printf("namespace A::B\n"); //命名空间可以嵌套
            }
        }
    }

    namespace B
    {
        void func()
        {
            printf("namespace B\n");
        }
    }
    
    // 使命名空间A::B生效
    using namespace A::B;   
    // 尽量少用
    // using namespace std(标准库)
    // using namespace boost(号称标准库的后花园)
    // 这两个放一起这种写法是灾难的，因为很多标准库的东西都是借鉴自boost库，这意味着它们很多东西都是重名的，放一起就混乱了
    int main()
    {
        A::func();
        B::func();
        func(); // 只写func()的时候，会自动使用前面using使能的命名空间，虽然可以简化写法
        return 0;
    }
#endif